/*******************************************************************************
  * 文件：DevStandby.c
  * 作者：djy
  * 版本：v1.0.0
  * 日期：2024-08-26
  * 说明：设备待机处理
*******************************************************************************/
/* 头文件 *********************************************************************/
#include "DevStandby.h"
#include "DevState.h"
#include "DevRun.h"
#include "Buzzer.h"
#include "Hardware_IO.h"
#include "Display.h"
#include "HobCtrl.h"
#include "Relay.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
static DevStandbyCtrl_ts sDevStandbyCtrl;
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名：DevStandby_TimingHandler
  * 功  能：设备待机-定时处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
static void DevStandby_IdleCheckTimingHandler(void)
{
    // 若在开机状态下，且设备没有运行，(不考虑童锁)，超过60S
    if(eDEV_RUN == Dev_GetCurrentState() 
       && DevRun_CheckIsBusy() == FALSE 
        //    && Dev_GetChildLock() == FALSE
                && OS_TimerGetExpiredTimes(&sDevStandbyCtrl.sTimer) >= 60)
    {
        // 关闭定时器
        OS_TimerStop(&sDevStandbyCtrl.sTimer);

        // 进入待机状态
        Dev_ChangeState(eDEV_STANDBY);

        // 信息调试
        DEBUG("Dev no option > 60s\r\n");
    }
}

/*******************************************************************************
  * 函数名：DevStandby_TimingHandler
  * 功  能：设备待机-定时处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void DevStandby_ResetIdleCheck(void)
{
    if(eDEV_RUN == Dev_GetCurrentState())
    {
        OS_TimerRestart(&sDevStandbyCtrl.sTimer,1000,DevStandby_IdleCheckTimingHandler);
    }
}

/*******************************************************************************
  * 函数名：DevStandby_TimingHandler
  * 功  能：设备待机-定时处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
static void DevStandby_TimingHandler(void)
{
    // 状态已切换
    if(eDEV_STANDBY != Dev_GetCurrentState())
    {
        // 提前退出
        OS_TimerStop(&sDevStandbyCtrl.sTimer);
        return;
    }
            
    // 对童锁显示部分的处理-已开启童锁
    if(Dev_GetChildLock() == TRUE)
    {
        // 清除童锁显示
        Display_ClearTime();

        // 停止定时器
        OS_TimerStop(&sDevStandbyCtrl.sTimer);
    }
}

/*******************************************************************************
  * 函数名：DevStandby_RestartTimer
  * 功  能：设备待机-清除空闲定时器的到期次数
  * 参  数：无
  * 返回值：无
  * 说  明：待机时若开启童锁，重启定时器，持续显示Lo一分钟
*******************************************************************************/
void DevStandby_RestartTimer(void)
{
    // 处理空闲定时器的到期次数-待机时
    OS_TimerRestart(&sDevStandbyCtrl.sTimer,60000,DevStandby_TimingHandler);
}

/*******************************************************************************
  * 函数名：DevStandby_Start
  * 功  能：设备待机-开始
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void DevStandby_Start(void)
{
    // 关机时停止所有炉头加热
    for(U8 u8CZIndex = u8CZ1;u8CZIndex <= u8CZ4;u8CZIndex++)
    {
        HobCtrl_StopHeating(u8CZIndex);
    }
    
    if(eDEV_RUN == Dev_GetLastState())
    {
        // 关机音
        Buzzer_Play(eBUZZER_SOUND_GOODBEY,eBUZZER_VOL_HIGH);
    }
    
    // 数码管清空显示
    Display_ClearAll();
    
    // 若开启童锁，则显示Lo
    if(Dev_GetChildLock() == TRUE)
    {
        Display_ShowLock();
        
        // 启动待机定时器，60S
        OS_TimerRestart(&sDevStandbyCtrl.sTimer,60000,DevStandby_TimingHandler);
    }
}

/***************************** 文件结束 ***************************************/

